package com.baizhi;


import com.baizhi.dao.CmfzGuruDao;
import com.baizhi.entity.CmfzGuru;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes=CmfzdemoApplication.class)
public class testRePOI {

    @Resource
    private CmfzGuruDao cmfzGuruDao;

    @Test
    public void test1() throws IOException, IllegalAccessException {

        List<CmfzGuru> guruList = cmfzGuruDao.selectList(null);
        for (CmfzGuru cmfzGuru : guruList) {

            System.out.println(cmfzGuru);
        }
        /**
         * 先写入 标题栏数据
         */
        String[] titles = new String[]{"上师编号","上师图片地址", "上师姓名", "上师法名", "上师状态"};
//         1.创建文件对象
        HSSFWorkbook workbook = new HSSFWorkbook();

//         2.创建表对象
        HSSFSheet sheet = workbook.createSheet("guru");
//        3.创建标题栏
        HSSFRow titleRow = sheet.createRow(0);

//        4.在标题栏中写入数据

        for (int i = 0; i <titles.length; i++) {
            HSSFCell cell = titleRow.createCell(i);
            cell.setCellValue(titles[i]);
        }
        /**
         * 写入上师数据
         */
        for (int i = 1; i <=guruList.size() ; i++) {
//            创建行
            HSSFRow row = sheet.createRow(i);
//            将上师数据写入到行中
            CmfzGuru cmfzGuru = guruList.get(i-1);

            /**
             * 对象的属性值可以循环获取吗?  只是poi是不能的  需要自己使用反射封装
             * 通过反射优化代码
             * 1.获取类对象
             * 2.获取到所有属性对象
             * 3.遍历属性对象
             * 3.1 创建单元格
             * 3.2获取属性对象对应的属性值
             * 3.3将属性值写入单元格
             *
             */
//            1.获取类对象
            Class<? extends CmfzGuru> guruClass = cmfzGuru.getClass();

//            2.获取到所有属性对象
            Field[] fields = guruClass.getDeclaredFields();
//            3.遍历属性对象
            for (int j = 0; j <fields.length ; j++) {
//                3.1 创建单元格
                HSSFCell cell = row.createCell(j);
//                3.2获取属性对象对应的属性值
                Field field = fields[j];
                field.setAccessible(true);
                Object o = field.get(cmfzGuru);
//                3.3将属性值写入单元格
                cell.setCellValue(o.toString());
            }

        }

//        文件保存本地
        workbook.write(new FileOutputStream("F://框架阶段//上师demo.xls"));
    }

    @Test
    public void test2() throws IOException {
//        1.通过流读取Excel文件
        FileInputStream inputStream = new FileInputStream("F://框架阶段//上师demo.xls");
//        2.通过POI解析流 HSSFWorkbook 处理流得到的对象中  就封装了Excel中的所有数据
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//        3.从文件中获取对象 getSheetAt通过下标获取
        HSSFSheet sheet = workbook.getSheetAt(0);
//        4.从表中获取到行数据  从第二行开始 到 最后一行  getLastRowNum()  获取最后一行的下标
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 1; i <=lastRowNum ; i++) {
//            通过下标获取行
            HSSFRow row = sheet.getRow(i);

//            从行中获取数据
            HSSFCell cell = row.getCell(0);


            Integer id = Integer.valueOf(cell.getStringCellValue());

            String img = row.getCell(1).getStringCellValue();

            String name = row.getCell(2).getStringCellValue();

            String nickname = row.getCell(3).getStringCellValue();

            Integer status = Integer.valueOf(row.getCell(4).getStringCellValue());

            CmfzGuru cmfzGuru = new CmfzGuru();
            cmfzGuru.setGuruId(id);
            cmfzGuru.setGuruImage(img);
            cmfzGuru.setGuruName(name);
            cmfzGuru.setGuruNickname(nickname);
            cmfzGuru.setGuruStatus(status);
            System.out.println(cmfzGuru);
            //将数据添加到数据库
            int i1 = cmfzGuruDao.insert(cmfzGuru);
            System.out.println(i1);
        }

    }
}
